package com.ruoyi.common.utils;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 序号生成工具类
 * 规则：按照拼音首字母大写+年月日+五位序列号(从00001-99999)
 * 
 * @author ruoyi
 */
public class SerialNumberUtils 
{
    /** 日期格式化器 */
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
    
    /** 序列号计数器，按日期分组 */
    private static final ConcurrentHashMap<String, AtomicInteger> COUNTERS = new ConcurrentHashMap<>();
    
    /** 序列号最大值 */
    private static final int MAX_SEQUENCE = 99999;
    
    /**
     * 生成工作序号
     * 格式：GZ + yyyyMMdd + 五位序列号
     * 
     * @return 工作序号
     */
    public static String generateWorkSerial() 
    {
        return generateSerial("GZ", "工作");
    }
    
    /**
     * 生成反馈序号
     * 格式：FK + yyyyMMdd + 五位序列号
     * 
     * @return 反馈序号
     */
    public static String generateFeedbackSerial() 
    {
        return generateSerial("FK", "反馈");
    }

    /**
     * 生成快递登记序号
     * 格式：KD + yyyyMMdd + 五位序列号
     *
     * @return 快递序号
     */
    public static String generateExpressSerial()
    {
        return generateSerial("KD", "快递");
    }
    
    /**
     * 生成序号
     * 
     * @param prefix 前缀（拼音首字母）
     * @param type 类型名称（用于日志）
     * @return 序号
     */
    private static String generateSerial(String prefix, String type) 
    {
        String today = LocalDate.now().format(DATE_FORMATTER);
        String key = prefix + "_" + today;
        
        AtomicInteger counter = COUNTERS.computeIfAbsent(key, k -> new AtomicInteger(0));
        int sequence = counter.incrementAndGet();
        
        // 如果超过最大值，重置为1
        if (sequence > MAX_SEQUENCE) 
        {
            counter.set(1);
            sequence = 1;
        }
        
        String serialNumber = prefix + today + String.format("%05d", sequence);
        
        // 清理过期的计数器（前一天的数据）
        cleanupOldCounters(today);
        
        return serialNumber;
    }
    
    /**
     * 清理过期的计数器
     * 
     * @param currentDate 当前日期
     */
    private static void cleanupOldCounters(String currentDate) 
    {
        COUNTERS.entrySet().removeIf(entry -> {
            String key = entry.getKey();
            String dateInKey = key.substring(3); // 去掉前缀（如"GZ_"）
            return !dateInKey.equals(currentDate);
        });
    }
}
